#include <malloc.h>
#include<stdio.h>
#include<stdlib.h>

/**** petite macro pour choisir le type des matrices et vecteurs (entiers, reels) ******/
// gcc -DTYPE_INT
#ifdef INT
typedef int T;
#else
#ifdef FLOAT
typedef float T;
#else
 #error "Need to give MACRO definition for element type : -DINT or -DFLOAT"
#endif
#endif
/***************************************************************************************/


#include "fonctions.c"



/*********** programme principal********************************/ 

int main(int argc, char *argv[])
{


	//declarations parametres
	// on precisera la taille des matrices en ligne de commande
	int dim=atoi(argv[1]);
	int f_compteur=atoi(argv[2]);
	int i,j;
	int Nmax=dim-1;
	
	int valeurmax, valeurmin;
	
	T* u;
	T* v;
 
	//pour le stockage MEI des matrices creuses
	T **AA; //stocke les valeurs des coefficients non nuls par ligne
	int **JA; //contient les numéros de colonne des elements non nuls

 
	//allocation dynamique matrice AA et JA equivalent a une diagonales (coeff aleatoires) 
	AA=(T**)malloc(dim*sizeof(*AA));
	JA=(int**)malloc(dim*sizeof(*JA));
	v=(T*)malloc(dim*sizeof(T));
	u=(T*)malloc(dim*sizeof(T));
	
	valeurmax=100000;
	valeurmin=-100000;
	for(i=0;i<dim;i++)
	{
		AA[i]=(T*)malloc((dim-1)*sizeof(**AA));
		JA[i]=(int*)malloc((dim-1)*sizeof(**JA));
		AA[i][0]=(T)rand()*(valeurmax-valeurmin)+valeurmin;
		JA[i][0]=i;
		v[i]=(T)0;
		u[i]=(T)i;
	}
	for(i=0;i<dim;i++)
	{
		for(j=0;j<dim-1;j++)
		{
			AA[i][j]=0;
			JA[i][j]=i; 
		}
	} 
	

	//appel fonction produit

	SPMV_EI(AA,JA,u,v,dim,Nmax,f_compteur);

	/**************liberation memoire***********************************************/
	//liberation en memoire de A,u et v

	free(u);
	free(v);
	
	//liberation en memoire de AA et JA 
	for(i=0;i<dim-1;i++)
	{
		free(AA[i]);
		free(JA[i]);
	}
	free(AA);
	free(JA);
/****************************************************************************/

return 0;
}

